/**
 * 文件级注释：
 * 认证状态管理（Pinia）。负责保存登录令牌与当前用户信息，
 * 并在登录后基于现有后端接口检查并标记“平台管理员/平台超级管理员”角色关联。
 * 仅在 H5 项目中编写/修改代码；前端统一以返回值 code === 0 判定成功。
 */
import { defineStore } from 'pinia'
import type { UserInfo } from '../services/user'
import { OrganizationService } from '../services/organization'
import { isSuccess } from '../services/types'

/**
 * 类级注释：认证状态结构
 * @property token 登录令牌
 * @property user 当前用户信息
 * @property isPlatformAdmin 是否拥有平台管理员角色
 * @property isPlatformSuperAdmin 是否拥有平台超级管理员角色
 */
interface AuthState {
  token: string | null
  user: UserInfo | null
  isPlatformAdmin: boolean
  isPlatformSuperAdmin: boolean
}

const TOKEN_KEY = 'wcs_token'
const USER_KEY = 'wcs_user'
const ROLE_FLAGS_KEY = 'wcs_role_flags'

export const useAuthStore = defineStore('auth', {
  state: (): AuthState => ({
    token: (() => {
      if (typeof window !== 'undefined' && window.localStorage) {
        return localStorage.getItem(TOKEN_KEY)
      }
      return null
    })(),
    user: (() => {
      if (typeof window !== 'undefined' && window.localStorage) {
        const raw = localStorage.getItem(USER_KEY)
        return raw ? JSON.parse(raw) : null
      }
      return null
    })(),
    isPlatformAdmin: (() => {
      try {
        if (typeof window !== 'undefined' && window.localStorage) {
          const raw = localStorage.getItem(ROLE_FLAGS_KEY)
          return raw ? !!(JSON.parse(raw)?.isPlatformAdmin) : false
        }
      } catch { 
        return false 
      }
      return false
    })(),
    isPlatformSuperAdmin: (() => {
      try {
        if (typeof window !== 'undefined' && window.localStorage) {
          const raw = localStorage.getItem(ROLE_FLAGS_KEY)
          return raw ? !!(JSON.parse(raw)?.isPlatformSuperAdmin) : false
        }
      } catch { 
        return false 
      }
      return false
    })()
  }),
  getters: {
    isAuthenticated: (s) => !!s.token
  },
  actions: {
    /**
     * 函数级注释：设置令牌
     * @param token 登录令牌或 null
     * @returns void 无返回值
     * @throws 无（安全写入本地存储）
     */
    setToken(token: string | null) {
      this.token = token
      if (typeof window !== 'undefined' && window.localStorage) {
        if (token) localStorage.setItem(TOKEN_KEY, token)
        else localStorage.removeItem(TOKEN_KEY)
      }
    },
    /**
     * 函数级注释：设置当前用户信息
     * @param user 用户信息或 null
     * @returns void 无返回值
     * @throws 无（安全写入本地存储）
     */
    setUser(user: UserInfo | null) {
      this.user = user
      if (typeof window !== 'undefined' && window.localStorage) {
        if (user) localStorage.setItem(USER_KEY, JSON.stringify(user))
        else localStorage.removeItem(USER_KEY)
      }
    },
    /**
     * 函数级注释：设置平台角色标记（持久化）
     * @param flags 标记对象：{ isPlatformAdmin, isPlatformSuperAdmin }
     * @returns void 无返回值
     * @throws 无（安全写入本地存储）
     */
    setRoleFlags(flags: { isPlatformAdmin: boolean; isPlatformSuperAdmin: boolean }) {
      this.isPlatformAdmin = !!flags.isPlatformAdmin
      this.isPlatformSuperAdmin = !!flags.isPlatformSuperAdmin
      try {
        if (typeof window !== 'undefined' && window.localStorage) {
          localStorage.setItem(ROLE_FLAGS_KEY, JSON.stringify({
            isPlatformAdmin: this.isPlatformAdmin,
            isPlatformSuperAdmin: this.isPlatformSuperAdmin
          }))
        }
      } catch { /* 忽略持久化异常 */ }
    },
    /**
     * 函数级注释：刷新当前登录用户的“平台管理员/平台超级管理员”标记
     * @returns Promise<void> 无返回值
     * @throws 可能抛出网络异常（接口请求失败）
     * 说明：通过 `/Organization/GetUserRoleMerchantList` 获取角色记录，并以字符串匹配方式判断是否包含平台管理员/平台超级管理员。
     */
    async refreshRoleFlags(): Promise<void> {
      try {
        const resp = await OrganizationService.getUserRoleMerchantList()
        if (isSuccess(resp) && Array.isArray(resp.data)) {
          const rows = resp.data as any[]
          // 判定逻辑：组织为平台（OrganizationType==0 或 无商户/门店），且角色名包含关键字
          const hasPlatformAdmin = rows.some(r => {
            const name = String(r.roleName ?? r.RoleName ?? '')
            const orgType = Number(r.organizationType ?? r.OrganizationType ?? -1)
            const merchantId = String(r.merchantId ?? r.MerchantId ?? '')
            const storeId = String(r.storeId ?? r.StoreId ?? '')
            const isPlatform = orgType === 0 || (!merchantId && !storeId)
            return isPlatform && (name === '平台管理员' || (name.includes('平台') && name.includes('管理员')) || (name.includes('平台') && name.includes('管理')))
          })
          const hasPlatformSuperAdmin = rows.some(r => {
            const name = String(r.roleName ?? r.RoleName ?? '')
            const orgType = Number(r.organizationType ?? r.OrganizationType ?? -1)
            const merchantId = String(r.merchantId ?? r.MerchantId ?? '')
            const storeId = String(r.storeId ?? r.StoreId ?? '')
            const isPlatform = orgType === 0 || (!merchantId && !storeId)
            return isPlatform && (name === '平台超级管理员' || (name.includes('平台') && (name.includes('超级') || name.includes('超管'))))
          })
          this.setRoleFlags({ isPlatformAdmin: hasPlatformAdmin, isPlatformSuperAdmin: hasPlatformSuperAdmin })
        } else {
          // 接口失败则清空标记
          this.setRoleFlags({ isPlatformAdmin: false, isPlatformSuperAdmin: false })
        }
      } catch (e) {
        // 异常情况下安全回退为 false
        this.setRoleFlags({ isPlatformAdmin: false, isPlatformSuperAdmin: false })
        // 不抛出异常以避免影响登录流；如需可在控制台打印
        // console.error('refreshRoleFlags failed', e)
      }
    },
    /**
     * 函数级注释：注销登录
     * @returns void 无返回值
     * @throws 无
     */
    logout() {
      this.setToken(null)
      this.setUser(null)
      this.setRoleFlags({ isPlatformAdmin: false, isPlatformSuperAdmin: false })
    }
  }
})
